Introduction

Preprocessing

## LOAD DATA

# Regular tables
data_appln <- read_rds('../temp/data_appln.rds')
data_pers_appln  <- read_rds('../temp/data_pers_appln.rds')
data_nace2 <- read_rds('../temp/data_nace2.rds')
data_docdb_fam_cpc <- read_rds('../temp/data_docdb_fam_cpc.rds')
#data_person <- read_rds('../temp/data_person.rds')


# Regional specialization
region_RTA <- read_rds('../temp/region_RTA.rds') %>% 
  mutate(country = nuts %>% str_sub(1,2),
         nuts_period = paste(nuts, 'P', period)) 

region_tech <- read_rds('../temp/region_tech.rds') %>% 
  mutate(country = nuts %>% str_sub(1,2),
         nuts_period = paste(nuts, 'P', period)) 

# Technology space
g_tech <- read_rds('../temp/g_tech.rds')

# Lists
list_nace2 <- read_rds('../temp/list_nace2.rds')

# Applicants
region_applt_appln <- read_rds('../temp/tbl_region_applt_appln.rds') %>% select(-applt_seq_nr, -invt_seq_nr)
region_applt <- read_rds('../temp/tbl_region_applt.rds')
## Defining parameters
n_cutoff = 50
n_cutoff_green = 25
## SELECT FOCUS REGIONS
reg_in = '' # c('SE232', 'NO043', 'DK012')
n_regions = 4     

# Restrict to top N regions
select_region <- region_tech %>%
  group_by(country, nuts) %>%
  summarise(n = sum(weight_frac, na.rm = TRUE),
            n_Y = sum(weight_frac * Y_tag, na.rm = TRUE)) %>%
  ungroup() %>%
  group_by(country) %>%
  arrange(desc(n_Y)) %>%
  mutate(index = 1:n()) %>%
  ungroup() %>%
  filter(index <= n_regions | nuts %in% reg_in) %>%
  distinct(nuts) %>%
  pull(nuts)
## `summarise()` has grouped output by 'country'. You can override using the
## `.groups` argument.
rm(reg_in)
# Createdataframe with technology relatedness edgelist
tech_rel <- g_tech %E>%
  mutate(from_nace = .N()$name[from],
         to_nace = .N()$name[to]) %>%
  as_tibble() %>%
  mutate(from = from_nace %>% as.character(),
         to = to_nace %>% as.character()) %>%
  arrange(from, to) %>%
  select(from, to, weight)

tech_rel %<>%
  # Add opposite direction
  bind_rows(tech_rel %>% 
              rename(from_new = to, to_new = from) %>% 
              rename(from = from_new, to = to_new) %>%
              relocate(from, to)) %>%
  # Add self loops
  bind_rows(tech_rel %>%
              distinct(from) %>%
              mutate(to = from,
                     weight = 1)) %>%
  distinct(from, to, .keep_all = TRUE)
# Summarize Regions
region_RTA_agg <- region_RTA %>%
  group_by(country, nuts, period, nuts_period, Y_tag) %>%
  summarise(n_spec = rta_bin %>% sum(na.rm = TRUE),
            n_spec_count = (n_tech_region * rta_bin) %>% sum(na.rm = TRUE),
            HHI = sum((n_tech_region/sum(n_tech_region) * 100)^2) ) %>%
  ungroup() 
## `summarise()` has grouped output by 'country', 'nuts', 'period', 'nuts_period'.
## You can override using the `.groups` argument.
# Dataframe with regions and technology fields
tech_dev <- region_RTA %>%
  select(country, period, nuts, nuts_period, nace_group, Y_tag, n_tech_region, rta, rta_bin) %>%
  arrange(country, nuts, nace_group, Y_tag, period) %>%
  group_by(country, nuts, nace_group, Y_tag) %>%
  mutate(n_tech_region_lag = lag(n_tech_region, 1),
         n_tech_region_delta = n_tech_region - n_tech_region_lag,
         pct_tech_region_delta = (n_tech_region - n_tech_region_lag) / ( n_tech_region_lag + 1),
         rta_lag = lag(rta, 1),
         rta_delta = rta - rta_lag,
         rta_bin_lag = lag(rta_bin, 1),
         rta_bin_delta = rta_bin - rta_bin_lag) %>%
  ungroup() %>%
  arrange(country, nuts, nace_group, Y_tag, period) 

Patent application development

data_appln %>%
  filter(appln_filing_year <= 2015, appln_filing_year >= 1985) %>%
  count(appln_filing_year, Y_tag) %>%
  ggplot(aes(x = appln_filing_year, y = n, col = Y_tag)) + 
  geom_line(key_glyph = "timeseries") +
  labs(title = 'Patent applications: Development',
       subtitle = 'All Nordic contries, by Y tag',
       x = 'Year',
       y = 'Number applications',
       col = 'Green')

data_pers_appln %>%
  filter(appln_filing_year <= 2015, appln_filing_year >= 1985) %>%
  filter(nuts %in% select_region) %>%
  count(appln_filing_year, nuts, Y_tag, wt = weight_frac) %>%
  ggplot(aes(x = appln_filing_year, y = n, col = nuts)) + 
  geom_line(key_glyph = "timeseries") +
  facet_wrap(vars(Y_tag), scales = 'free') +
  labs(title = 'Patent applications: Development',
       subtitle = 'All Nordic contries',
       x = 'Year',
       y = 'Number applications, by region and Y tag',
       col = 'Nuts3')

data_pers_appln %>%
  filter(appln_filing_year <= 2015, appln_filing_year >= 1985) %>%
  count(appln_filing_year, person_ctry_code, Y_tag, wt = weight_frac) %>%
  ggplot(aes(x = appln_filing_year, y = n, col = person_ctry_code)) + 
  geom_line(key_glyph = "timeseries") +
  facet_wrap(vars(Y_tag), scales = 'free') +
  labs(title = 'Patent applications: Development by country',
       subtitle = 'All Nordic contries',
       x = 'Year',
       y = 'Number applications, by region and Y tag',
       col = 'Country')

Applicants

region_applt_appln %<>%
  group_by(appln_id) %>%
  mutate(n_frac = 1 / n()) %>%
  ungroup() %>%
  left_join(region_applt %>% select(person_id, han_id, han_name, person_ctry_code, nuts), by = 'person_id') %>%
  left_join(data_appln %>% select(appln_id, docdb_family_id, appln_filing_year, period, Y_tag), by = 'appln_id') %>%
  left_join(data_nace2 %>% select(appln_id, nace_group) %>% group_by(appln_id) %>% mutate(nace_share = 1 / n()) %>% ungroup() %>% nest(nace = c(nace_group, nace_share)), by = 'appln_id') %>%
  drop_na()
# List main applicants
applt_stats <- region_applt_appln %>%
  group_by(han_id, han_name) %>%
  summarise(
    n_pat = sum(n_frac),
    n_Y = sum(n_frac * Y_tag),
    first_pat = min(appln_filing_year)
    ) %>%
  mutate(share_Y = n_Y / n_pat,
         age = 2016 - first_pat,
         incumbant = age >= 10 & n_pat >= 10) %>%
  ungroup() %>%
  arrange(desc(n_pat))
## `summarise()` has grouped output by 'han_id'. You can override using the
## `.groups` argument.
applt_stats %>% head(200)
applt_stats %>% arrange(desc(n_Y)) %>% head(100)
# Share of incumbants by technology
region_techn_incumb <- region_applt_appln %>% 
  left_join(applt_stats %>% select(han_id, incumbant), by = 'han_id') %>%
  unnest(nace) %>%
  mutate(n_weight = n_frac * nace_share) %>%
  group_by(nuts, nace_group, period, Y_tag) %>%
  summarise(n = sum(n_weight),
            n_inc = sum(n_weight * incumbant)) %>%
  ungroup() %>%
  mutate(share_inc = n_inc / n)
## `summarise()` has grouped output by 'nuts', 'nace_group', 'period'. You can
## override using the `.groups` argument.

Y TAgs

data_docdb_fam_cpc %>% 
  filter(Y_tag == TRUE) %>%
  mutate(cpc_class_symbol = cpc_class_symbol %>% str_sub(1,4)) %>%
  count(cpc_class_symbol, sort = TRUE)

Technology space general

set.seed(1337)
coords_tech <- g_tech %>% igraph::layout.fruchterman.reingold() %>% as_tibble()
## Warning: The `x` argument of `as_tibble.matrix()` must have unique column names if
## `.name_repair` is omitted as of tibble 2.0.0.
## ℹ Using compatibility `.name_repair`.
colnames(coords_tech) <- c("x", "y")
g_tech %N>%
  mutate(nace_group_name = nace_group_name %>% str_trunc(50, side = 'right')) %>%
  ggraph(layout =  coords_tech) + 
  geom_edge_link(aes(width = weight, alpha = weight), colour = "grey") + 
  geom_node_point(aes(colour = nace_sec_name, size = dgr)) + 
  geom_node_text(aes(label = nace_group_name, size = dgr, filter = percent_rank(dgr) >= 0.75 ), repel = TRUE) +
  theme_void() +
  theme(legend.position="bottom") + 
  labs(title = 'Industry Space (all Nordics)',
       subtitle = 'Nodes = NACE 2 Industries. Edges: Relatedness')
## Warning: Using the `size` aesthetic in this geom was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` in the `default_aes` field and elsewhere instead.
## Warning: Removed 4 rows containing missing values (`geom_text_repel()`).

Regional specialization (RTA) development

p1 <- region_RTA_agg  %>%
  filter(nuts %in% select_region) %>%
  pivot_wider(names_from = Y_tag, values_from = c(n_spec, n_spec_count, HHI), values_fill = 0, names_prefix = 'Y_tag_') 

p2 <- p1 %>% 
  select(period, nuts, n_spec_Y_tag_FALSE, n_spec_Y_tag_TRUE) %>%
  pivot_wider(names_from = period, values_from = c(n_spec_Y_tag_FALSE, n_spec_Y_tag_TRUE))
p1 %>%
  ggplot(aes(x = n_spec_Y_tag_FALSE, y = n_spec_Y_tag_TRUE)) +
  geom_segment(data = p2, 
               aes(x = n_spec_Y_tag_FALSE_1,
                   y = n_spec_Y_tag_TRUE_1,
                   xend = n_spec_Y_tag_FALSE_2,
                   yend = n_spec_Y_tag_TRUE_2,
                   size = 0.75),
               alpha = 0.15,
               arrow = arrow(length = unit(0.5, "cm"), type = "closed"),
               show.legend = FALSE) +
  geom_point(aes(size = n_spec_count_Y_tag_TRUE, col = HHI_Y_tag_TRUE)) +
  geom_text_repel(aes(label = nuts), box.padding = 0.5, max.overlaps = Inf) +
  scale_color_gradient2(low = "skyblue", mid = 'yellow', high = "red", midpoint = 1) +
  scale_size(range = c(2, 10)) + 
  labs(title = 'Development of new regional specializations', 
       subtitle = 'By number of green and non green specializations in period 1 and 2',
       note = '',
       x = 'N non-green specializations',
       y = 'N green specializations',
       size = 'N green patents',
       col = 'HHI green patents') 
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.

rm(p1, p2)

Analysis for existing green paths:

tech_rel_dev <- tech_rel %>% 
  select(from, to, weight) %>%
  left_join(tech_dev %>% distinct(nace_group, nuts), by = c('from' = 'nace_group')) %>%
  # filter for rta in period 1
  inner_join(tech_dev %>% filter(period == '1', rta_bin == 1) %>% select(nace_group, nuts, Y_tag), by = c('to' = 'nace_group', 'nuts')) %>%
  # filter for new green specialization in period 2
  semi_join(tech_dev %>% filter(period == '2', rta_bin == 1, rta_bin_delta == 1, Y_tag == TRUE), by = c('from' = 'nace_group', 'nuts')) %>%
  rename(nace_group = from, related_techn = to) 
p1 <- tech_rel_dev %>%
  group_by(nuts, nace_group, Y_tag) %>%
  summarise(rel_max = weight %>% max(),
            rel_sum = weight %>% sum(),
            rel_mean = weight %>% mean()) %>%
  ungroup() %>%
  #
  group_by(nuts, Y_tag) %>%
  summarise(rel = rel_max %>% mean()) %>%
  ungroup() %>%
  #
  pivot_wider(names_from = Y_tag, values_from = rel, names_prefix = 'Y_', values_fill = 0) %>%
  left_join(tech_dev %>% filter(Y_tag == TRUE, period == '2', rta_bin == 1) %>% select(nuts , n_tech_region) %>% count(nuts, wt = n_tech_region), by = c('nuts')) %>%
  mutate(country = nuts %>% str_sub(1,2)) 
## `summarise()` has grouped output by 'nuts', 'nace_group'. You can override
## using the `.groups` argument.
## `summarise()` has grouped output by 'nuts'. You can override using the
## `.groups` argument.
x_mid <- mean(p1$Y_FALSE, na.rm = TRUE)
y_mid <- mean(p1$Y_TRUE, na.rm = TRUE)

p1 %>%
  filter(0.5 <= percent_rank(n)) %>%
  ggplot(aes(x = Y_FALSE, y = Y_TRUE, size = n)) +
  geom_vline(xintercept = x_mid, linetype = "dashed", color = 'grey') + 
  geom_hline(yintercept = y_mid, linetype = "dashed", color = 'grey') +
  geom_point(aes(col = country)) +
  geom_text_repel(aes(label = nuts), box.padding = 0.5, max.overlaps = Inf) +
  theme(legend.position="bottom") + 
    labs(title = 'New green specialization period 2', 
       subtitle = 'By nuts regions',
       note = 'Relatedness is the mean over all new green specializations, per green specialization largest relatedness to former specialization counted',
       x = 'Relatedness non-green',
       y = 'Relatedness green',
       size = 'N green patents') 

rm(p1, x_mid, y_mid)
library(regions)
data(nuts_changes)
list_nuts <- nuts_changes %>% select(code_2021, geo_name_2021) 
colnames(list_nuts) <- c('nuts', 'nuts_name')
# TODO: Include NO names by hand
p1 <- tech_rel_dev %>%
  filter(nuts %in% select_region) %>%
  group_by(nuts, nace_group, Y_tag) %>%
  summarise(rel = weight %>% max()) %>%
  ungroup() %>%
  pivot_wider(names_from = Y_tag, values_from = rel, names_prefix = 'Y_', values_fill = 0) %>%
  left_join(tech_dev %>% 
              filter(Y_tag == TRUE, period == '2', rta_bin_delta == 1) %>% 
              count(nuts, nace_group, wt = n_tech_region), 
            by = c('nuts', 'nace_group')) %>%
  mutate(country = nuts %>% str_sub(1,2)) %>%
  left_join(list_nace2 %>%select(nace_group, nace_sec_name) %>% distinct(), by = 'nace_group') %>%
  left_join(list_nuts %>% distinct(), by = 'nuts') %>% mutate(nuts_name = paste(nuts, nuts_name, sep = ': ') )
## `summarise()` has grouped output by 'nuts', 'nace_group'. You can override
## using the `.groups` argument.
x_mid <- mean(p1$Y_FALSE, na.rm = TRUE)
y_mid <- mean(p1$Y_TRUE, na.rm = TRUE)

# plotting
p1 %>%
  ggplot(aes(x = Y_FALSE, y = Y_TRUE, size = n, col = nace_sec_name)) +
  geom_point() +
  geom_text_repel(aes(label = nace_group), box.padding = 0.5) +
  geom_vline(xintercept = x_mid, linetype = "dashed", color = 'grey') + 
  geom_hline(yintercept = y_mid, linetype = "dashed", color = 'grey') +
  facet_wrap(vars(nuts_name), ncol = n_regions) +
  theme(legend.position = 'bottom',
        legend.box = "vertical") +
  labs(title = 'New green specialization period 2', 
       subtitle = 'By nuts regions',
       note = 'Relatedness is the mean over all new green specializations, per green specialization largest relatedness to former specialization counted',
       x = 'Relatedness non-green',
       y = 'Relatedness green',
       col = 'NACE',
       size = 'N green patents') 
## Warning: ggrepel: 1 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

rm(p1, x_mid, y_mid)

!!! MAke additio nal ploty including old green specializations

Profiling regions

path_green_new <- tech_rel_dev %>%
  group_by(nuts, nace_group, Y_tag) %>%
  summarise(rel = weight %>% max()) %>%
  ungroup() %>%
  pivot_wider(names_from = Y_tag, values_from = rel, names_prefix = 'Y_', values_fill = 0) %>%
  left_join(tech_dev %>% 
              filter(Y_tag == TRUE, period == '2', rta_bin_delta == 1) %>% 
              select(nuts, nace_group, n_tech_region) %>% 
              count(nuts, nace_group, wt = n_tech_region), 
            by = c('nuts', 'nace_group')) %>%
  mutate(green_path = case_when( 
    Y_FALSE <= mean(Y_FALSE) & Y_TRUE <= mean(Y_TRUE) ~ 'creation',
    Y_FALSE <= mean(Y_FALSE) & Y_TRUE > mean(Y_TRUE) ~ 'diversification',
    Y_FALSE > mean(Y_FALSE) & Y_TRUE <= mean(Y_TRUE) ~ 'renewal',
    Y_FALSE > mean(Y_FALSE) & Y_TRUE > mean(Y_TRUE) ~ 'renewal'
    ) ) %>%
  select(-Y_FALSE, - Y_TRUE)
## `summarise()` has grouped output by 'nuts', 'nace_group'. You can override
## using the `.groups` argument.
path_green <- tech_dev %>% 
  mutate(green_path = case_when( 
    Y_tag == TRUE & period == '2' & rta_bin == 1 & rta_bin_delta == 0 & pct_tech_region_delta < 0.1 ~ 'stagnation',
    Y_tag == TRUE & period == '2' & rta_bin == 1 & rta_bin_delta == 0 & pct_tech_region_delta >= 0.1 ~ 'extension',
    Y_tag == TRUE & period == '2' & rta_bin == 0 & rta_bin_delta == -1 ~ 'extinction'
  )) %>%
  drop_na(green_path) %>%
  select(nuts, nace_group, n_tech_region_delta, green_path) %>%
  rename(n = n_tech_region_delta) %>%
  # add existing green paths
  bind_rows(path_green_new) %>%
  mutate(n = n %>% abs()) %>%
  # add incumbant measures
  left_join(region_techn_incumb %>% filter(period == '2', Y_tag == TRUE) %>% select(nuts, nace_group, share_inc), by = c('nuts', 'nace_group')) %>%
  mutate(n_new = n * (1 - share_inc),
         n_inc = n * share_inc)

TODO: Increase text size

path_green %>%
  filter(nuts %in% select_region, green_path != 'stagnation') %>%
  # split by inc and non_incumbents
  pivot_longer(c(n_new, n_inc), names_to = 'applt_type') %>% 
  # Aggregate
  count(nuts, green_path, applt_type, wt = value) %>%
  complete(nuts, green_path, applt_type, fill = list('n' =  0)) %>%
  # Add overall patents andf make share
  left_join(region_RTA %>%filter(period == '2') %>%  count(nuts, wt = n_region, name = 'n_reg'), by = 'nuts') %>%
  mutate(n_share = n ) %>% #/ n_reg) %>%
  left_join(list_nuts %>% distinct(), by = 'nuts') %>% mutate(nuts_name = paste(nuts, nuts_name, sep = ': ') ) %>%
  # plotting
  ggplot() +
  geom_col(aes(x = green_path, y = n_share, fill = applt_type, col = green_path), alpha = 0.8, position= "stack")  + 
  # Lollipop shaft 
  #geom_segment( aes(x = green_path, y = 0, xend = green_path, yend = 0.002), linetype = "dashed", color = "gray12") + 
  # coord_polar() +
  # coord_flip() + 
  facet_wrap(vars(nuts_name), ncol = n_regions, scales = 'free') +
  theme(axis.text.x = element_text(angle = 60, vjust = 1, hjust=1)) + 
  theme(legend.position = 'bottom',
        legend.box = "vertical") +
  labs(title = 'Regional green paths', 
       subtitle = 'By nuts regions',
       note = 'xxxx',
       x = NULL,
       y = NULL,
       size = 'Share green patents',
       col = 'Green path type',
       fill = 'Applicant type') 

Break down main path industry

Geoplotting

# See: https://ropengov.github.io/giscoR/ 

# Get map of nordics
map_nordic <- gisco_get_nuts(country = c('DNK', 'SWE', 'NOR', 'FIN'), nuts_level = 3, year = '2016')

# filter out Svalbart etc
map_nordic %<>%
  filter(!(NUTS_ID %in% c('NO0B1', 'NO0B2')))

# Group by NUTS by country and convert to lines
country_lines <- map_nordic %>%
  group_by(CNTR_CODE) %>%
  summarise(n = n()) %>%
  ungroup() %>%
  st_cast("MULTILINESTRING")
map_nordic %>%
  # enter main green path
  left_join(path_green %>% count(nuts, green_path, wt = n) %>% group_by(nuts) %>% slice_max(order_by = n, n = 1, with_ties = FALSE) %>% ungroup(), by = c('NUTS_ID' = 'nuts')) %>%
  # plot
  ggplot() + 
  geom_sf(aes(fill = green_path)) +
  geom_sf(data = country_lines, col = "blue", linewidth = 0.1) + 
  theme_void() +
  labs(title = 'Map: Nordic main green paths', 
       subtitle = 'By nuts regions',
       note = 'Excluding NO0B1,NO0B2',
       x = NULL,
       y = NULL,
       fill = 'Main green path') #+ theme(legend.position = 'bottom')

Tables

All green paths

tab_1 <- tech_dev %>%
  filter(period == 2) %>%
  count(nuts, Y_tag, wt = n_tech_region) %>%
  pivot_wider(names_from = Y_tag, values_from = n, values_fill = 0, names_prefix = 'Y_') %>%
  mutate(Y_FALSE = round(Y_FALSE), Y_TRUE = round(Y_TRUE),
         Y_share = (Y_TRUE / (Y_FALSE + Y_TRUE)  ) %>% round(2)  )

tab_1
tab_2 <- region_applt_appln %>%
  filter(period == 2) %>%
  count(nuts, han_name, han_id, Y_tag, wt = n_frac) %>%
  pivot_wider(names_from = Y_tag, values_from = n, values_fill = 0, names_prefix = 'Y_') %>%
  mutate(Y_FALSE = round(Y_FALSE), Y_TRUE = round(Y_TRUE),
         Y_share = (Y_TRUE / (Y_FALSE + Y_TRUE)  ) %>% round(2)) %>% 
  group_by(nuts) %>%
  slice_max(order_by = Y_TRUE, n = 1, with_ties = FALSE) %>%
  ungroup() %>%
  left_join(applt_stats %>% select(han_id, incumbant) %>% mutate(incumbant = ifelse(incumbant == TRUE, 'incumb.', 'entrant')), by = 'han_id') %>%
  mutate(applicant = paste0(han_name, ' (',incumbant ,', n green: ', Y_TRUE, ', share:', Y_share, ')')) %>%
  select(nuts, applicant)

tab_2
tab_3 <- path_green %>%
  count(nuts, green_path, wt = n) %>%
  group_by(nuts) %>%
  mutate(share = (n / sum(n)) %>% round(2) ) %>%
  ungroup() %>%
  select(-n) %>%
  pivot_wider(names_from = green_path, values_from = share, names_prefix= '% path ', values_fill = 0) %>%
  arrange(nuts)

tab_3
tab_all <- tab_1 %>%
  left_join(tab_2, by = 'nuts') %>%
  left_join(tab_3, by = 'nuts')

tab_all
library(stargazer)
## 
## Please cite as:
##  Hlavac, Marek (2022). stargazer: Well-Formatted Regression and Summary Statistics Tables.
##  R package version 5.2.3. https://CRAN.R-project.org/package=stargazer
tab_all %>% stargazer(summary = FALSE, type = 'html')
nuts Y_FALSE Y_TRUE Y_share applicant % path creation % path diversification % path extension % path extinction % path renewal % path stagnation
1 DK011 751 66 0.08 DUPONT NUTRITION BIOSCIENCES APS (incumb., n green: 14, share:0.14) 0.18 0.2 0.48 0.12 0.02 0
2 DK012 1126 64 0.05 NOVOZYMES AS (incumb., n green: 68, share:0.16) 0.15 0.15 0.42 0.26 0 0.02
3 DK013 1273 92 0.07 VKR HOLDING AS (incumb., n green: 16, share:0.05) 0.25 0.21 0.46 0.02 0.06 0
4 DK014 18 0 0 BORNHOLMS AS (entrant, n green: 0, share:0) NA NA NA NA NA NA
5 DK021 292 30 0.09 FORSKNINGSCENTER RISO (incumb., n green: 3, share:1) 0.05 0.37 0.03 0.12 0.41 0.02
6 DK022 240 18 0.07 BLADENA APS (entrant, n green: 5, share:1) 0.14 0.26 0.37 0.17 0.03 0.02
7 DK031 240 92 0.28 IRD FUEL CELLS AS (entrant, n green: 8, share:1) 0.14 0.03 0.18 0.06 0.59 0
8 DK032 569 210 0.27 LM WP PATENT HOLDING AS (incumb., n green: 77, share:0.93) 0.02 0.01 0.82 0.01 0.15 0
9 DK041 400 235 0.37 SIEMENS GAMESA RENEWABLE ENERGY AS (incumb., n green: 150, share:0.89) 0.04 0 0.8 0.02 0.13 0
10 DK042 745 394 0.35 VESTAS WIND SYSTEMS AS (incumb., n green: 606, share:0.94) 0.04 0 0.91 0.01 0.04 0
11 DK050 329 60 0.15 LIFTRA IP APS (entrant, n green: 3, share:1) 0.18 0 0.71 0.02 0.03 0.06
12 FI193 176 12 0.06 ECOCAT LTD (incumb., n green: 6, share:0.46) 0.22 0.05 0.16 0.25 0.33 0
13 FI194 46 2 0.04 RMV TECH LTD (entrant, n green: 2, share:1) 0.8 0 0 0 0.2 0
14 FI195 259 77 0.23 WARTSILA FINLAND LTD (incumb., n green: 139, share:0.45) 0 0 0.81 0 0.19 0
15 FI196 115 24 0.17 NORILSK NICKEL HARJAVALTA LTD (entrant, n green: 4, share:1) 0 0 0.82 0.08 0.09 0
16 FI197 1198 65 0.05 SANDVIK MINING CONSTRUCTION LTD (incumb., n green: 14, share:0.11) 0.03 0.45 0.43 0 0.03
17 FI1B1 3860 296 0.07 NOKIA TECH LTD (incumb., n green: 109, share:0.07) 0 0.32 0.61 0.02 0.04 0.01
18 FI1C1 650 44 0.06 OY LANGH TECH AB (entrant, n green: 3, share:1) 0.32 0.2 0.13 0.22 0.12 0
19 FI1C2 103 4 0.04 EKOKEM PALVELU LTD (entrant, n green: 1, share:1) 0 0.34 0.2 0 0.46 0
20 FI1C3 99 6 0.06 WATERBOX LTD (entrant, n green: 5, share:0.71) 0 0.26 0.17 0.46 0.11 0
21 FI1C4 69 4 0.05 HALTON LTD (incumb., n green: 2, share:0.2) 0.42 0.14 0 0.36 0.08 0
22 FI1C5 89 16 0.15 VISEDO LTD (entrant, n green: 11, share:0.61) 0.43 0.06 0 0.06 0.45 0
23 FI1D1 39 2 0.05 SAVO SOLAR LTD (entrant, n green: 5, share:1) 0.8 0 0 0.2 0 0
24 FI1D2 88 5 0.05 PONSSE PLC (incumb., n green: 2, share:0.08) 0.33 0 0 0 0.67 0
25 FI1D3 74 2 0.03 HOLJAKKA LTD (entrant, n green: 1, share:0.5) 0.65 0 0 0 0 0.35
26 FI1D4 16 0 0 MATTOASENNUS KARJALAINEN LTD (entrant, n green: 1, share:1) NA NA NA NA NA NA
27 FI1D5 12 3 0.2 FREEPORT COBALT LTD (entrant, n green: 1, share:1) 0 0 0.45 0 0.55 0
28 FI1D6 759 47 0.06 PROVENTIA EMISSION CONTROL LTD (entrant, n green: 3, share:0.6) 0 0.06 0.69 0.16 0.1 0
29 FI1D7 26 3 0.1 SAVATERRA LTD (entrant, n green: 2, share:0.67) 0 0.6 0 0.15 0.25 0
30 FI200 9 1 0.1 ASCE AB LTD (entrant, n green: 0, share:0) 1 0 0 0 0 0
31 NO011 453 29 0.06 NORSK HYDRO ASA (incumb., n green: 14, share:0.14) 0.16 0.04 0.02 0.37 0.37 0.02
32 NO012 286 33 0.1 AKER ENGINEERING TECH AS (entrant, n green: 11, share:0.69) 0.04 0.1 0.13 0.14 0.53
33 NO021 24 2 0.08 ARBAFLAME TECH AS (entrant, n green: 2, share:1) 0.5 0.5 0 0 0 0
34 NO022 30 3 0.09 HEXAGON RAGASCO AS (entrant, n green: 2, share:1) 0.2 0 0 0 0.8 0
35 NO031 61 10 0.14 BORREGAARD AS (entrant, n green: 3, share:0.25) 0.33 0 0.05 0.1 0.52 0
36 NO032 116 6 0.05 ELTEK AS (entrant, n green: 5, share:0.71) 0.39 0.15 0.02 0.39 0.05 0
37 NO033 93 5 0.05 ANOXKALDNES AS (entrant, n green: 2, share:1) 0.02 0.23 0 0.53 0.21 0
38 NO034 133 13 0.09 EFD INDUCTION AS (entrant, n green: 1, share:1) 0.23 0 0.24 0 0.16 0.38
39 NO041 43 5 0.1 FLUMILL AS (entrant, n green: 1, share:1) 0.18 0 0 0.13 0.69 0
40 NO042 85 10 0.11 METALLKRAFT AS (entrant, n green: 3, share:1) 0.86 0 0 0.14 0 0
41 NO043 361 25 0.06 HYWIND AS (entrant, n green: 8, share:1) 0.01 0.05 0.35 0.16 0.42 0.01
42 NO051 168 24 0.12 BERGEN TEKNOLOGIOVERFØRING AS (incumb., n green: 4, share:0.31) 0.18 0 0.25 0.11 0.46 0
43 NO052 21 3 0.12 ECOMERDEN AS (entrant, n green: 2, share:1) 0 0.4 0 0.4 0.2 0
44 NO053 104 14 0.12 SIRIUS TECH AS (entrant, n green: 4, share:1) 0.09 0 0 0.06 0.81 0.04
45 NO061 214 31 0.13 SINVENT AS (incumb., n green: 5, share:0.13) 0.04 0.03 0.09 0.38 0.46 0
46 NO062 14 5 0.26 DYNAVEC AS (entrant, n green: 1, share:1) 0.23 0.34 0 0.23 0.19 0
47 NO071 19 4 0.17 AKER BIOMARINE ANTARCTIC AS (entrant, n green: 2, share:0.67) 0.12 0 0.88 0 0 0
48 NO072 32 5 0.14 HYDRA TIDAL ENERGY TECH AS (entrant, n green: 4, share:1) 0.8 0 0 0 0.2 0
49 NO073 1 0 0 HAMMERFEST STROM AS (entrant, n green: 2, share:1) 0 0.2 0 0.8 0 0
50 SE110 5903 386 0.06 TELEFON AB LM ERICSSON PUBL (incumb., n green: 476, share:0.06) 0 0.04 0.75 0.18 0.04 0
51 SE121 673 27 0.04 SEABASED AB (incumb., n green: 3, share:1) 0.02 0.02 0.7 0.16 0.09 0.01
52 SE122 246 12 0.05 VOLVO CONSTRUCTION EQUIPMENT AB (incumb., n green: 16, share:0.14) 0.11 0 0.43 0.35 0 0.12
53 SE123 982 60 0.06 SAAB AB (incumb., n green: 24, share:0.07) 0.02 0 0.74 0.11 0.12 0
54 SE124 177 2 0.01 CHEMATUR ENGINEERING AB (entrant, n green: 2, share:1) 0.26 0 0.06 0.68 0 0
55 SE125 477 95 0.17 WESTINGHOUSE ELECT SE AB (incumb., n green: 54, share:0.98) 0.02 0 0.05 0.06 0.46 0.41
56 SE211 390 11 0.03 HUSQVARNA AB (incumb., n green: 37, share:0.16) 0.15 0.25 0.37 0.23 0 0
57 SE212 164 15 0.08 SODRA SKOGSAGARNA EKONOMISK FORENING (entrant, n green: 2, share:0.29) 0.4 0 0.5 0 0.1 0
58 SE213 103 10 0.09 Jilken, Leif Anders (entrant, n green: 2, share:1) 0.15 0.39 0 0.31 0.15 0
59 SE214 5 0 0 CEDERGRENS MEK VERKSTAD AB (entrant, n green: 0, share:0) 1 0 0 0 0 0
60 SE221 110 9 0.08 EMG ENERGIMONTAGEGRUPPEN AB (entrant, n green: 2, share:1) 0.7 0 0 0.04 0.24 0.02
61 SE224 2924 179 0.06 ALFA LAVAL CORPORATE AB (incumb., n green: 20, share:0.07) 0.01 0.03 0.77 0.07 0.1 0.01
62 SE231 314 23 0.07 AB HALMSTADS GUMMIFABRIK (entrant, n green: 1, share:1) 0.06 0.16 0.14 0.18 0.46 0
63 SE232 2886 238 0.08 VOLVO LASTVAGNAR AB (incumb., n green: 96, share:0.23) 0.03 0.07 0.58 0.31 0.01 0.01
64 SE311 215 16 0.07 ROLLS ROYCE AB (incumb., n green: 2, share:0.12) 0.08 0.18 0.09 0.19 0.33 0.12
65 SE312 245 15 0.06 KASI TECH AB (entrant, n green: 5, share:1) 0.16 0 0.06 0.19 0.03 0.55
66 SE313 342 4 0.01 SANDVIK INTELLECTUAL PROPERTY AB (incumb., n green: 12, share:0.02) 0.14 0.28 0.28 0.23 0 0.07
67 SE321 130 5 0.04 VALMET AB (incumb., n green: 13, share:0.15) 0 0.3 0.04 0.61 0.05 0
68 SE322 38 0 0 AARVAGS BARGNING MEK AB (entrant, n green: 0, share:0) 1 0 0 0 0
69 SE331 136 12 0.08 BIOENDEV AB (entrant, n green: 7, share:1) 0.36 0.06 0 0.24 0.17 0.16
70 SE332 303 22 0.07 SUNPINE AB (entrant, n green: 3, share:0.75) 0.03 0 0.77 0.2 0 0

Endnotes

sessionInfo()
## R version 4.2.1 (2022-06-23)
## Platform: x86_64-apple-darwin17.0 (64-bit)
## Running under: macOS Big Sur ... 10.16
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib
## 
## locale:
## [1] C/en_US.UTF-8/C/C/C/C
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] stargazer_5.2.3 regions_0.1.8   sf_1.0-9        giscoR_0.3.2   
##  [5] ggrepel_0.9.1   ggraph_2.1.0    tidygraph_1.2.2 dbplyr_2.2.1   
##  [9] RPostgres_1.4.4 DBI_1.1.3       magrittr_2.0.3  forcats_0.5.2  
## [13] stringr_1.5.0   dplyr_1.0.10    purrr_1.0.1     readr_2.1.3    
## [17] tidyr_1.2.1     tibble_3.1.8    ggplot2_3.4.0   tidyverse_1.3.2
## 
## loaded via a namespace (and not attached):
##  [1] fs_1.6.1            lubridate_1.8.0     bit64_4.0.5        
##  [4] httr_1.4.4          rprojroot_2.0.3     tools_4.2.1        
##  [7] backports_1.4.1     bslib_0.4.2         utf8_1.2.2         
## [10] R6_2.5.1            KernSmooth_2.23-20  colorspace_2.1-0   
## [13] withr_2.5.0         tidyselect_1.2.0    gridExtra_2.3      
## [16] bit_4.0.5           compiler_4.2.1      cli_3.6.0          
## [19] rvest_1.0.3         xml2_1.3.3          labeling_0.4.2     
## [22] sass_0.4.5          scales_1.2.1        classInt_0.4-8     
## [25] proxy_0.4-27        digest_0.6.31       rmarkdown_2.20     
## [28] pkgconfig_2.0.3     htmltools_0.5.4     highr_0.10         
## [31] fastmap_1.1.0       rlang_1.0.6         readxl_1.4.1       
## [34] rstudioapi_0.14     jquerylib_0.1.4     farver_2.1.1       
## [37] generics_0.1.3      jsonlite_1.8.4      googlesheets4_1.0.1
## [40] s2_1.1.1            Rcpp_1.0.10         munsell_0.5.0      
## [43] fansi_1.0.3         viridis_0.6.2       lifecycle_1.0.3    
## [46] stringi_1.7.12      yaml_2.3.7          MASS_7.3-57        
## [49] grid_4.2.1          blob_1.2.3          crayon_1.5.2       
## [52] graphlayouts_0.8.3  haven_2.5.1         hms_1.1.2          
## [55] knitr_1.42          pillar_1.8.1        igraph_1.3.5       
## [58] wk_0.7.1            reprex_2.0.2        glue_1.6.2         
## [61] evaluate_0.20       modelr_0.1.9        vctrs_0.5.2        
## [64] tzdb_0.3.0          tweenr_2.0.2        cellranger_1.1.0   
## [67] gtable_0.3.1        polyclip_1.10-4     assertthat_0.2.1   
## [70] cachem_1.0.6        xfun_0.37           ggforce_0.4.1      
## [73] countrycode_1.4.0   broom_1.0.1         e1071_1.7-12       
## [76] class_7.3-20        googledrive_2.0.0   viridisLite_0.4.1  
## [79] gargle_1.2.1        units_0.8-1         ellipsis_0.3.2     
## [82] here_1.0.1